package cn.miaoyao.miaoyaoms.Handler;

import cn.miaoyao.miaoyaoms.entity.Miaosample;
import cn.miaoyao.miaoyaoms.service.MiaosampleService;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author: shushu
 * @Date: 2023/05/17/21:05
 * @Description:excel监听器
 */
@Slf4j
@Service
public class ExcelListener extends AnalysisEventListener {

    //返回读取到的excel中的数据。
   List<Miaosample> dataList= new ArrayList<>();
   private MiaosampleService miaosampleService;

    /**
     * 每存5条到列表就存一次数据库，实际中，若数据太多，则会导致io增大而损耗性能，然后清理list,方便内存回收。
     */
    private static final int BATCH_COUNT=5;
    public ExcelListener() {

    }
    //将需要处理的业务接口传进来。
    public ExcelListener(MiaosampleService miaosampleService){
        this.miaosampleService=miaosampleService;
    }

    /**
     * 每一条数据解析都会来调用该方法。
     * @param t
     * @param analysisContext
     */
    @Override
    public void invoke(Object t, AnalysisContext analysisContext) {
        log.info("【Excel文件】解析到一条数据{}", JSON.toJSONString(t));
        dataList.add((Miaosample) t);//将解析的数据存入到dataList列表。
        if(dataList.size()>=BATCH_COUNT){
            //存一次数据库。存的时候转换成miaosample类来存。
            saveData();
            //存完之后就清空列表
            dataList.clear();
        }
    }
    /**
     * 所有数据解析完成了,才会来调用
     * @param analysisContext
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        saveData();//当最后一次不足5条时候，那就直接再存一次。
        log.info("【Excel文件】Excel所有数据解析完毕");
    }

    /**
     * 将数据保存到数据库
     */
    public void saveData(){
        log.info("【开始将数据存入数据库】");
        LambdaQueryWrapper<Miaosample> msw = new LambdaQueryWrapper<>();
        dataList.forEach(data->{
            //miaosampleService.saveBatch(dataList);//保存到数据库中。
            msw.eq(Miaosample::getZhname,data.getZhname());
            Miaosample miao = miaosampleService.getOne(msw);
            if(miao==null)
            miaosampleService.save(data);//保存到数据库
        });
    }

    /**
     * 返回data数据，判断其中还有数据没有。
     * @return
     */
    public List<Miaosample> getDataList(){
        return this.dataList;
    }
}
